package us.proyecto.canarios.actions.movil;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.log.Log;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.data.category.DefaultCategoryDataset;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
import org.richfaces.component.html.HtmlTree;
import org.richfaces.event.NodeSelectedEvent;
import org.richfaces.model.TreeNode;

import us.proyecto.canarios.actions.admin.AutenticacionAction;
import us.proyecto.canarios.dao.ConcursoDAO;
import us.proyecto.canarios.dao.DiccionarioDAO;
import us.proyecto.canarios.dao.PajarosDAO;
import us.proyecto.canarios.dao.UsuarioDAO;
import us.proyecto.canarios.domain.Asociacion;
import us.proyecto.canarios.domain.Concurso;
import us.proyecto.canarios.domain.Criador;
import us.proyecto.canarios.domain.Incidencia;
import us.proyecto.canarios.domain.Pajaro;
import us.proyecto.canarios.domain.Puntuacion;
import us.proyecto.canarios.domain.Tipo;
import us.proyecto.canarios.domain.Usuario;
import us.proyecto.canarios.domain.Votacion;

@Name("consultaCanarioMovil")
@Scope(ScopeType.SESSION)
public class ConsultaCanarioMovilAction {

	@Logger
	Log log;

	private String nombre;
	private Asociacion asociacion;
	private Date fechaInicio;
	private Date fechaFin;
	private String idPuntuacion;
	private String votacion;

	@In(create = true)
	private UsuarioDAO usuarioDAO;

	private List<Tipo> listaTipos;

	private List<Asociacion> listaAsociaciones;


	private List<Puntuacion> listaConcursos;

	@In(create = true)
	private ConcursoDAO concursoDAO;

	@In(create = true)
	private DiccionarioDAO diccionariosDAO;

	@In(create = true)
	private PajarosDAO pajarosDAO;

	private List<Criador> listaCriadores;

	private Puntuacion puntuacion;


	private Concurso concurso;

	@In(create = true)
	private AutenticacionAction autenticacion;


	// private Tipo tipo;

	private Pajaro pajaro;

	private List<Incidencia> listaIncidencias;


	private byte[] grafica;

	private byte[] fotoNoDis;

	private byte[] grafica2;

	private StreamedContent chart1;

	private StreamedContent chart2;

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public void selectPajaro(){

		//idPuntuacion = idPuntuacion;
		URL uri = this.getClass().getClassLoader().getResource("plantillas/imagenNoDisp.jpg");

			File file;
			try {
				file = new File(uri.toURI());
				InputStream is = new FileInputStream(file);
				fotoNoDis = new byte[is.available()];
				is.read(fotoNoDis);
				is.close();
			} catch (URISyntaxException e) {
				FacesMessages.instance().add("Se ha producido un error inesperado");
				e.printStackTrace();
			} catch (FileNotFoundException e) {
				FacesMessages.instance().add("Se ha producido un error inesperado");
				e.printStackTrace();
			} catch (IOException e) {
				FacesMessages.instance().add("Se ha producido un error inesperado");
				e.printStackTrace();
			}
//		System.out.println("hola");
		Puntuacion p = pajarosDAO.getPuntuacionById(idPuntuacion);
		puntuacion = p;
		if(pajaro == null || (pajaro != null && p.getPajaro().getIdPajaro() != pajaro.getIdPajaro())){
			pajaro=p.getPajaro();
			concurso = p.getConcurso();
			listaConcursos = pajarosDAO.getPuntuacionesPajaro(pajaro);
			crearGrafica();
			crearGraficaVotacion();
		}
	}



	public String traduce(String s) {
		String res = "";
		if (s.equals("true")) {
			res = "Si";
		} else {
			res = "No";
		}
		return res;

	}

	public void gestion() {
		pajaro = new Pajaro();
		puntuacion = new Puntuacion();
		puntuacion.setPajaro(pajaro);
		pajaro.setPuntuaciones(new HashSet<Puntuacion>());
		pajaro.getPuntuaciones().add(puntuacion);
		listaCriadores = usuarioDAO.getCriadores();

	}

	public String gestion(Concurso con) {
		if(con.getIdConcurso()!=0){
			concurso = con;
			pajaro = new Pajaro();
			puntuacion = new Puntuacion();
			puntuacion.setPajaro(pajaro);
			puntuacion.setConcurso(con);
			pajaro.setPuntuaciones(new HashSet<Puntuacion>());
			pajaro.getPuntuaciones().add(puntuacion);
			listaCriadores = usuarioDAO.getCriadores();
			puntuacion.setNumJaula(concursoDAO.obtieneNumJaula(concurso));
			crearGrafica();
			crearGraficaVotacion();
			return "true";
		}
		return "false";

	}

	/**
	 * @return the asociacion
	 */
	public Asociacion getAsociacion() {
		return asociacion;
	}

	/**
	 * @param asociacion
	 *            the asociacion to set
	 */
	public void setAsociacion(Asociacion asociacion) {
		this.asociacion = asociacion;
	}

	/**
	 * @return the fechaInicio
	 */
	public Date getFechaInicio() {
		return fechaInicio;
	}

	/**
	 * @param fechaInicio
	 *            the fechaInicio to set
	 */
	public void setFechaInicio(Date fechaInicio) {
		this.fechaInicio = fechaInicio;
	}

	/**
	 * @return the fechaFin
	 */
	public Date getFechaFin() {
		return fechaFin;
	}

	/**
	 * @param fechaFin
	 *            the fechaFin to set
	 */
	public void setFechaFin(Date fechaFin) {
		this.fechaFin = fechaFin;
	}


	/**
	 * @return the listaAsociaciones
	 */
	public List<Asociacion> getListaAsociaciones() {
		return listaAsociaciones;
	}

	/**
	 * @param listaAsociaciones
	 *            the listaAsociaciones to set
	 */
	public void setListaAsociaciones(List<Asociacion> listaAsociaciones) {
		this.listaAsociaciones = listaAsociaciones;
	}

	public List<Tipo> getListaTipos() {
		if (listaTipos == null) {
			listaTipos = diccionariosDAO.getListaTipos();
		}
		return listaTipos;
	}

	public void setListaTipos(List<Tipo> listaTipos) {
		this.listaTipos = listaTipos;
	}


	public Concurso getConcurso() {
		return concurso;
	}

	public void setConcurso(Concurso concurso) {
		this.concurso = concurso;
	}

	/*
	 * public Tipo getTipo() { return tipo; }
	 *
	 * public void setTipo(Tipo tipo) { this.tipo = tipo; }
	 */


	public void cambiarConcurso() {
		puntuacion.setConcurso(concurso);
		if (pajaro.getPuntuaciones() != null && concurso != null) {
			boolean enc = false;
			for (Puntuacion pun : pajaro.getPuntuaciones()) {
				if (pun.getConcurso().getIdConcurso() == concurso
						.getIdConcurso()) {
					puntuacion = pun;
					enc = true;
				}
			}
			if (!enc) {
				puntuacion = new Puntuacion();
				puntuacion.setPajaro(pajaro);
				puntuacion.setConcurso(concurso);
				pajaro.getPuntuaciones().add(puntuacion);
			}
		}
	}

	public void buscarPajaro() {
		Pajaro p = pajarosDAO.getPajaroByNumAnilla(pajaro.getNumAnilla());
		Pajaro aux = pajaro;
		Puntuacion punt = puntuacion;
		pajaro = p;
		if (pajaro != null && pajaro.getPuntuaciones() != null
				&& concurso != null) {
			boolean enc = false;
			for (Puntuacion pun : pajaro.getPuntuaciones()) {
				if (pun.getConcurso() != null && pun.getConcurso().getIdConcurso() == concurso
						.getIdConcurso()) {
					FacesMessages
							.instance()
							.add("Este pajaro ya se ha dado de alta en el concurso, sus datos solo se actualizarán");
					puntuacion = pun;
					enc = true;
				}
			}
			if (!enc) {
				puntuacion = new Puntuacion();
				puntuacion.setPajaro(pajaro);
				puntuacion.setConcurso(concurso);
				pajaro.getPuntuaciones().add(puntuacion);
			}
		} else {
			pajaro = aux;
			puntuacion = punt;
			//puntuacion.setPajaro(pajaro);
			//puntuacion.setConcurso(concurso);
			//pajaro.setPuntuaciones(new HashSet<Puntuacion>());
			//pajaro.getPuntuaciones().add(puntuacion);
		}
	}

	public void guardar() {
		// pajaro.getPuntuaciones().add(puntuacion);
		if (pajaro.getIdPajaro() == 0) {
			pajarosDAO.save(pajaro);
		} else {
			pajarosDAO.update(pajaro);
		}

	}

	public void guardarIncidencia() {
		// pajaro.getPuntuaciones().add(puntuacion);
		puntuacion.setIncidencias(new HashSet<Incidencia>());
		Incidencia c = listaIncidencias.get(listaIncidencias.size()-1);
		listaIncidencias.remove(listaIncidencias.size()-1);
		puntuacion.getIncidencias().addAll(listaIncidencias);
		listaIncidencias.add(c);
		if (pajaro.getIdPajaro() == 0) {
			pajarosDAO.save(pajaro);
		} else {
			pajarosDAO.update(pajaro);
		}

	}

	public void guardarAnadir() {
		// pajaro.getPuntuaciones().add(puntuacion);
		if (pajaro.getIdPajaro() == 0) {
			pajarosDAO.save(pajaro);
		} else {
			pajarosDAO.update(pajaro);
		}
		Criador c = pajaro.getCriador();
		gestion(concurso);
		pajaro.setCriador(c);



	}

	public List<Criador> getListaCriadores() {
		return listaCriadores;
	}

	public void setListaCriadores(List<Criador> listaCriadores) {
		this.listaCriadores = listaCriadores;
	}

	public Pajaro getPajaro() {
		return pajaro;
	}

	public void setPajaro(Pajaro pajaro) {
		this.pajaro = pajaro;
	}

	public Puntuacion getPuntuacion() {
		return puntuacion;
	}

	public void setPuntuacion(Puntuacion puntuacion) {
		this.puntuacion = puntuacion;
	}

	public String processSelection(NodeSelectedEvent event) {
		HtmlTree tree = (HtmlTree) event.getComponent();
		TreeNode currentNode = tree.getModelTreeNode(tree.getRowKey());
		if (currentNode.isLeaf()) {
			Concurso c = (Concurso) currentNode.getData();
			concurso = c;
			pajaro = new Pajaro();
			puntuacion = new Puntuacion();
			puntuacion.setPajaro(pajaro);
			pajaro.setPuntuaciones(new HashSet<Puntuacion>());
			pajaro.getPuntuaciones().add(puntuacion);
			listaCriadores = usuarioDAO.getCriadores();
			return "true";
		} else {
			return "false";
		}
	}


	public List<Incidencia> getListaIncidencias() {
		return listaIncidencias;
	}

	public void setListaIncidencias(List<Incidencia> listaIncidencias) {
		this.listaIncidencias = listaIncidencias;
	}

	public void annadir(){
		Incidencia nueva2 =listaIncidencias.get(listaIncidencias.size()-1);
		nueva2.setNueva(false);
		Incidencia nueva = new Incidencia();
		nueva.setNueva(true);
		nueva.setFecha(new Date());
		nueva.setObservaciones("");
		nueva.setPuntuacion(puntuacion);
		listaIncidencias.add(nueva);
	}

	public byte[] getGrafica() {
		return grafica;
	}

	public void setGrafica(byte[] grafica) {
		this.grafica = grafica;
	}


	public void crearGrafica(){
		DefaultCategoryDataset categorydataset = new DefaultCategoryDataset();
		List<Puntuacion> listaCon = pajarosDAO.getPuntuacionesPajaro(pajaro);
		if(listaCon!= null){
			for(Puntuacion p:listaCon){
				if(p.getPuntuacion()!=null){
				categorydataset.addValue(Double.parseDouble(p.getPuntuacion()),"Puntuaciones", p.getConcurso().getNombre());
				}
			}
		}
		 JFreeChart chart = ChartFactory.createBarChart("Bar Chart Demo 8", "Concurso", "Puntuación", categorydataset, PlotOrientation.VERTICAL, false, true, false);
	        CategoryPlot categoryplot = (CategoryPlot)chart.getPlot();
	        NumberAxis numberaxis = (NumberAxis)categoryplot.getRangeAxis();
	        numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
	        numberaxis.setUpperMargin(0.14999999999999999D);
	        CategoryItemRenderer categoryitemrenderer = categoryplot.getRenderer();
	        categoryitemrenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
	        categoryitemrenderer.setSeriesItemLabelsVisible(0, Boolean.TRUE);
	        CategoryAxis categoryaxis = categoryplot.getDomainAxis();
	        categoryaxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
	        try {
                grafica = ChartUtilities.encodeAsPNG(chart.createBufferedImage(800, 500));
                File chartFile = new File("dynamichart");
                ChartUtilities.saveChartAsPNG(chartFile, chart, 400, 250);
                chart1 = new DefaultStreamedContent(new FileInputStream(chartFile), "image/png");

            } catch (IOException e) {
                System.err.println("Problem occurred creating chart.");
            }
	}

	public void crearGraficaVotacion(){
		DefaultCategoryDataset categorydataset = new DefaultCategoryDataset();
		List<Votacion> listaVot = new ArrayList<Votacion>(puntuacion.getVotaciones());
		int num0 = 0;
		int num1 = 0;
		int num2 = 0;
		int num3 = 0;
		int num4 = 0;
		int num5 = 0;
		if(listaVot!= null){
			for(Votacion p:listaVot){
				if(p.getValor()!=null){
					if(p.getValor().equals("0")){
						num0++;
					}else if(p.getValor().equals("1")){
						num1++;
					}else if(p.getValor().equals("2")){
						num2++;
					}else if(p.getValor().equals("3")){
						num3++;
					}else if(p.getValor().equals("4")){
						num4++;
					}else if(p.getValor().equals("5")){
						num5++;
					}
				}
			}
			categorydataset.addValue(Double.parseDouble(""+num0),"Votacion", "0");
			categorydataset.addValue(Double.parseDouble(""+num1),"Votacion", "1");
			categorydataset.addValue(Double.parseDouble(""+num2),"Votacion", "2");
			categorydataset.addValue(Double.parseDouble(""+num3),"Votacion", "3");
			categorydataset.addValue(Double.parseDouble(""+num4),"Votacion", "4");
			categorydataset.addValue(Double.parseDouble(""+num4),"Votacion", "5");
		}

		 JFreeChart chart = ChartFactory.createBarChart("Resultados", "Valoracion", "Votacion", categorydataset, PlotOrientation.HORIZONTAL, false, true, false);
	        CategoryPlot categoryplot = (CategoryPlot)chart.getPlot();
	        NumberAxis numberaxis = (NumberAxis)categoryplot.getRangeAxis();
	        numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
	        numberaxis.setUpperMargin(0.14999999999999999D);
	        CategoryItemRenderer categoryitemrenderer = categoryplot.getRenderer();
	        categoryitemrenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
	        categoryitemrenderer.setSeriesItemLabelsVisible(0, Boolean.TRUE);
	        CategoryAxis categoryaxis = categoryplot.getDomainAxis();
	        categoryaxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
	        try {
                grafica2 = ChartUtilities.encodeAsPNG(chart.createBufferedImage(800, 500));
                File chartFile = new File("dynamichart2");
                ChartUtilities.saveChartAsPNG(chartFile, chart, 400, 250);
                chart2 = new DefaultStreamedContent(new FileInputStream(chartFile), "image/png");

            } catch (IOException e) {
                System.err.println("Problem occurred creating chart.");
            }
	}

	public List<Puntuacion> getListaConcursos() {
		return listaConcursos;
	}

	public void setListaConcursos(List<Puntuacion> listaConcursos) {
		this.listaConcursos = listaConcursos;
	}

	public String getIdPuntuacion() {
		return idPuntuacion;
	}

	public void setIdPuntuacion(String idPuntuacion) {
		this.idPuntuacion = idPuntuacion;
	}


	public void prueba(){

	}

	public StreamedContent getChart1() {
		return chart1;
	}

	public void setChart1(StreamedContent chart1) {
		this.chart1 = chart1;
	}

	public byte[] getFotoNoDis() {
		return fotoNoDis;
	}

	public void setFotoNoDis(byte[] fotoNoDis) {
		this.fotoNoDis = fotoNoDis;
	}

	public String getVotacion() {
		return votacion;
	}

	public void setVotacion(String votacion) {
		this.votacion = votacion;
	}

	public void votar(){
		if(votacion!=null){
			Votacion v = new Votacion();
			v.setPuntuacion(puntuacion);
			v.setValor(votacion);
			puntuacion = pajarosDAO.sincroniza(puntuacion);
			if(puntuacion.getVotaciones()!=null){
				puntuacion.getVotaciones().add(v);
			}else{
				puntuacion.setVotaciones(new HashSet<Votacion>());
				puntuacion.getVotaciones().add(v);
			}
			pajarosDAO.update(puntuacion.getPajaro());
			crearGraficaVotacion();
		}
	}

	public byte[] getGrafica2() {
		return grafica2;
	}

	public void setGrafica2(byte[] grafica2) {
		this.grafica2 = grafica2;
	}

	public StreamedContent getChart2() {
		crearGraficaVotacion();
		return chart2;
	}

	public void setChart2(StreamedContent chart2) {
		this.chart2 = chart2;
	}



}
